﻿function AjaxDataLoader(urls, interval) {
    var t = this;
    t.interval = interval;
	t.urls = urls;
}
$.extend(AjaxDataLoader.prototype, {

    // 判断是否需要刷新
    _needRefresh : function(params) { return false; },
    
    // 析构Xhr
	_disposeXhr : function(isAbort) {
	    var t = this;
	    if (t._xhr) {
	        isAbort && t._xhr.abort();
	        delete t._xhr;
	    }
	},
	
	// 停止数据更新
	disposeUpdate : function() {
	    var t = this;
	    if (t._timerId) {
	        clearTimeout(t._timerId);
	        delete t._timerId;
	    }
	    
	    t._disposeXhr(true);
	},
	
	// 放弃读取操作
	abort : function() {
	    this._disposeXhr(true);
	},
    
    // 读取主数据
    load : function(params) {
        var t = this;
        params = params || { };
        
        t.disposeUpdate();
        
        // 触发BeforeLoad事件
        t.onBeforeLoad && t.onBeforeLoad(params);

        // 发送请求
        t._xhr = $.ajax.getJSON({
	        url : t.urls.create,
	        data : params,
	        timeout : 60000,
	        onSuccess : function(ret) {
	            t._disposeXhr();
	            t.hasLoaded = true;
	            t._preRender(ret);
		        t.update(params);
	        }
        });
    },
    
    // 更新数据
    update : function(params, isUpdateNow) {
        var t = this;
        
        if ( !t._needRefresh(params) ) { return; }
        
        function send() {
            t._disposeXhr(true);
            
            params = params || { };
            params.t = t._timestamp;
            
            $.ajax.getJSON({
		        url : t.urls.update,
		        data : params,
		        timeout : 60000,
		        onSuccess : function(ret) {
		            t._disposeXhr();
		            t._preRender(ret, true);
		            t._timerId = setTimeout(function() {
		                t.update(params);
		            }, t.interval);
		        }
	        });
        }
        
        isUpdateNow && send();
        
        t._timerId = setTimeout(send, t.interval);
    },
    
    _updateView : function(data) { },
    
    _createView : function(data) { },
    
    _preRender : function(ret, isUpdate) {
        this.onLoad && this.onLoad(ret ? ret.d : null);
    
        if (ret) {
            this._timestamp = ret.t;
        }
        
        this._render(ret ? ret.d : null, isUpdate);
    },
    
    _render : function(data, isUpdate) {
        var t = this;
        if (isUpdate) {
            t._updateView(data);
        } else {
            t._createView(data);
        }
        t.onRender && t.onRender();
    }
});


